//
// Double Linked List
// Created by Win10 on 2022/10/16.
//

#ifndef C_DATA_STRUCTURE_DL_LIST_H
#define C_DATA_STRUCTURE_DL_LIST_H
typedef int ElemType;

typedef struct DNode {
    ElemType data;
    struct DNode* prior, * next;
}DNode, * DLinkList;

//初始化双链表
bool InitDLinkList(DLinkList& L);

//判断双链表是否为空
bool empty(DLinkList L);

//按位查找：返回第i个结点
DNode* GetElem(DLinkList L, int i);

//按值查找：找到第一个数据域为e的结点
DNode* LocateElem(DLinkList L, ElemType e);

//在p节点之后插入s节点
bool InsertNextDNode(DNode* p, DNode* s);

//在p节点后面插入值是e的节点
bool InsertNextDNode(DNode* p, ElemType e);

//前插，在p节点前面插入节点s
bool InsertPriorDnode(DNode* p, DNode* s);

//按位插入，在第i个位置插入值为e的节点（位序i）
bool InsertDLinkList(DLinkList& L, int i, ElemType e);

//删除p节点的后继节点
bool DeleteNextNode(DNode* p);

//销毁双链表
bool DestoryList(DLinkList& L);

//尾插法
DLinkList List_TailInsert(DLinkList& L);

//头插法
DLinkList List_HeadInsert(DLinkList& L);

int Length(DLinkList L);


//删除指定节点s
bool DeleteNode(DNode* s);

//删除位序i的节点，e是i节点的值
bool ListDelete(DLinkList& L, int i, ElemType& e);


void print(DLinkList L);

void testDLinkList();

#endif //C_DATA_STRUCTURE_DL_LIST_H
